package com.hmkj.core.service.amount;

import com.etonepay.b2c.entity.BackForm;
import com.hmkj.core.api.lianlian.PayDataBean;
import com.hmkj.core.api.lianlian.PaymentInfo;
import com.hmkj.core.model.amount.RechargeModel;
import com.hmkj.core.po.amount.Recharge;
import com.hmkj.core.po.system.Bank;
import com.hmkj.core.po.user.User;
import com.hmkj.core.service.base.GenericService;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 充值记录业务相关Service接口<br>
 *
 * @author donfy
 * @ClassName: RechargeService
 * @date 2017-08-15 08:16:12
 */
public interface RechargeService extends GenericService<Integer, Recharge> {

    /**
     * 充值审核
     *
     * @param model
     */
    void doAudit(RechargeModel model) throws Exception;

    /**
     * 获取充值总额和提现总额
     *
     * @param userId
     * @return
     */
    Map<String, BigDecimal> findFundMoney(Integer userId);

    /**
     * 查询充值超时列表，进行取消处理
     *
     * @param expiredTime 超时时间
     * @return
     */
    List<Recharge> selectExpired(Date expiredTime);

    /**
     * 支付宝充值
     *
     * @param user
     * @param amount
     */
    void doAlipayRecharge(User user, BigDecimal amount);

    /**
     * 处理充值
     *
     * @param recharge 充值订单对象
     */
    void handRecharge(Recharge recharge);

    /**
     * 根据充值类型查询充值金额
     *
     * @param types 充值类型
     * @param in    1:in 2 not in
     * @return
     */
    BigDecimal selectSumAmountByType(int in, Integer agentId, String startTime, String endTime, Integer... types);


    /**
     * 联动优势快捷支付 - 生成充值订单
     *
     * @param user    充值用户
     * @param amount  充值基恩
     * @param orderId 订单号
     * @return 是否保存成功
     */
    boolean createOrder(User user, String amount, String orderId);

    /**
     * 联动优势快捷支付异步回调处理业务
     *
     * @param tradeNo           第三方流水号
     * @param orderId           订单号
     * @param amount            支付金额(以分为单位)
     * @param tradeState        交易状态
     * @param errorCode         提示代码
     * @param paySeq            银行流水号
     * @param usrPayAgreementId 支付协议号
     * @param gateId            支付银行
     * @param lastFourCardId    支付银行卡号后四位
     */
    void handleRechargeByUmpay(String tradeNo, String orderId, String amount, String tradeState, String errorCode, String paySeq,
                               String usrPayAgreementId, String gateId, String lastFourCardId);


    /**
     * 连连支付异步回调处理业务
     *
     * @param payDataBean 订单返回信息
     */
    void handleRechargeByLianLian(PayDataBean payDataBean);

    /**
     * 通过用户id和订单编号查询充值订单
     *
     * @param orderId 订单号
     * @return 充值订单
     */
    Recharge findByUserIdAndOrderNo(String orderId);

    /**
     * 易通支付充值（获取支付链接）
     *
     * @param amount  充值金额
     * @param userId  用户ID
     * @param baseUrl 来源URL
     * @return
     */
    String doRechargeByEtone(String amount, Integer userId, String baseUrl) throws Exception;

    /**
     * 易通支付充值异步回调
     *
     * @param backForm
     * @param hmTk
     */
    void doRechargeBackEtone(BackForm backForm, String hmTk);

    /**
     * 获取充值成功总额
     *
     * @param userId
     * @return
     */
    BigDecimal findRechargeAllMoney(Integer userId);

    /**
     * 联联支付 充值
     *
     * @param userId 用户ID
     * @param bankId 银行卡ID
     * @param hmTk   订单标识
     * @param amount 充值金额
     */
    PaymentInfo doRechargeByLianLian(Integer userId, Integer bankId, String hmTk, String amount);

    /**
     * 九派快捷充值
     *
     * @param userId    用户Id
     * @param checkCode 验证码
     */
    void doRechargeByNinePai(Integer userId, String checkCode);

    /**
     * 九派快捷充值异步回调
     *
     * @param dataMap 回调数据
     */
    void doRechargeBackNinePai(Map<String, String> dataMap);

    /**
     * 华融支付 快捷支付充值
     *
     * @param userId    用户Id
     * @param checkCode 验证码
     */
    void doRechargeByHR(Integer userId, String checkCode) throws Exception;

    /**
     * 华融快捷充值异步回调
     *
     * @param dataMap
     */
    void
    doRechargeBackHR(Map<String, String> dataMap);

    /**
     * 华融支付网银B2C充值
     *
     * @param userId    用户Id
     * @param bankId    银行id
     * @param map 参数数据
     */
    void doRechargeByHRB2C(Integer userId,Integer bankId, Map<String, String> map) throws Exception;

    /**
     * 华融网银B2C充值异步回调
     *
     * @param dataMap
     */
    void
    doRechargeBackHRB2C(Map<String, String> dataMap);
}
